跳到主要内容

VkPhysicalDeviceFeatures 全字段详解

· 阅读需 7 分钟
苏明才
Vulkan驱动填坑狮

VkPhysicalDeviceFeatures 全字段详解

字段名中文解释功能描述建议启用
robustBufferAccess可靠缓冲访问防止越界读取 buffer(安全性高,性能略降)✅ 建议启用
fullDrawIndexUint32完整 32 位索引支持 uint32_t 顶点索引(> 65535)✅ 建议启用
imageCubeArray立方体贴图数组支持 cube[] 类型纹理数组(天空盒、PBR)✅ 常用
independentBlend独立混合framebuffer 中每个颜色附件独立设置混合参数✅ 多渲染目标
geometryShader几何着色器支持 geometry shader 阶段✅ 若用
tessellationShader曲面细分着色器支持 tessellation shader 阶段✅ 若用
sampleRateShading每采样着色支持 MSAA 中 per-sample 着色✅ 若做 MSAA
dualSrcBlend双源混合Fragment Shader 可输出两种颜色供混合使用⚠️ 特殊需求
logicOp逻辑操作混合支持逻辑运算混合(AND, OR, XOR)❌ 少用
multiDrawIndirect多重绘制(间接)vkCmdDrawIndirect() 可一次提交多个 draw✅ 批处理优化
drawIndirectFirstInstance支持 firstInstance 参数vkCmdDrawIndirect() 支持 firstInstance > 0✅ 现代渲染常用
depthClamp深度裁剪替代剪裁 -1~1 范围(保持 z 方向顶点)✅ 阴影场景常用
depthBiasClamp深度偏移裁剪防止 bias 偏移过多导致错误✅ 阴影贴图常用
fillModeNonSolid非填充模式支持线框/点渲染(wireframe/points)✅ 调试用
depthBounds深度边界测试允许指定深度范围进行测试(优化)⚠️ 受限支持
wideLines宽线支持支持 >1 像素的线条宽度⚠️ 移动端大多不支持
largePoints大点支持点精灵支持大尺寸✅ 少量使用
alphaToOnealphaToOne支持将 fragment alpha 强制设置为 1.0⚠️ 透明排序时可用
multiViewport多视口支持一次绘制多个视口(VR、多屏)✅ 多摄像头渲染
samplerAnisotropy各向异性过滤提高纹理在斜角处的清晰度✅ 强烈建议启用
textureCompressionETC2ETC2 压缩纹理用于移动平台节省显存✅ 移动端强烈建议启用
textureCompressionASTC_LDRASTC 压缩纹理高质量压缩纹理格式✅ 若资源用 ASTC
textureCompressionBCBC压缩纹理桌面压缩格式(DXT1~5)✅ 桌面平台建议启用
occlusionQueryPrecise精确遮挡查询更高精度的 vkCmdBeginQuery()⚠️ 若做遮挡剔除
pipelineStatisticsQuery管线统计查询可统计 shader、vertices 等数据✅ 性能分析时用
vertexPipelineStoresAndAtomics顶点阶段写入/原子支持在顶点阶段写 SSBO✅ 特殊用途如粒子模拟
fragmentStoresAndAtomics片段阶段写入/原子允许 fragment shader 中对 buffer/image 原子操作✅ 做累加/排序等用
shaderTessellationAndGeometryPointSizeTess/Geo 支持点大小是否能在 GS/Tess 中设置 gl_PointSize⚠️ 特定图元需
shaderImageGatherExtended扩展 imageGather支持更复杂的纹理采样 gather 操作✅ 多数现代 GPU 支持
shaderStorageImageExtendedFormatsimage 格式扩展支持非标准格式的 storage image✅ 若用 float16/uint
shaderStorageImageMultisample多采样 image 支持支持对 multisample image 的读写✅ 做 MSAA resolve shader 时必需
shaderStorageImageReadWithoutFormat无格式读取 image读 storage image 不需指定格式✅ 更灵活
shaderStorageImageWriteWithoutFormat无格式写入 image写 storage image 不需指定格式✅ 若写入 raw data
shaderUniformBufferArrayDynamicIndexing动态索引 UBO 数组Shader 支持 runtime 动态访问 uniform 数组✅ 常用
shaderSampledImageArrayDynamicIndexing动态索引 Texture 数组Shader 支持 runtime 动态访问纹理数组✅ 常用
shaderStorageBufferArrayDynamicIndexing动态索引 SSBO 数组Shader 支持 runtime 动态访问 storage buffer 数组✅ 常用
shaderStorageImageArrayDynamicIndexing动态索引 image 数组Shader 支持 runtime 动态访问 image 数组✅ 常用
shaderClipDistance支持 clip distance用 gl_ClipDistance 实现自定义裁剪✅ 特效需要
shaderCullDistance支持 cull distance提前剔除片段(更省资源)✅ 多用于优化
shaderFloat64double 精度 float支持 64 位 float⚠️ 少数场合用(科学计算)
shaderInt6464 位整数支持 long 类型 int✅ 若 GPU 计算需要
shaderInt1616 位整数支持短整数(需 Vulkan 1.1 或扩展)✅ 移动端节省带宽
shaderResourceResidency资源驻留控制用于 bindless resource 管理⚠️ 仅 NVIDIA 特性
shaderResourceMinLod最小 LOD 控制更细粒度的 mip 控制✅ 特效优化
sparseBinding稀疏资源绑定支持虚拟贴图(虚拟内存分页)⚠️ 高级用途
sparseResidencyBuffer稀疏 Buffer支持虚拟化 buffer 内存⚠️ 少数应用
sparseResidencyImage2D/3D稀疏图像虚拟贴图支持⚠️ 高级虚拟纹理系统
sparseResidencyAliased稀疏别名多个资源共享内存页⚠️ 专业图形系统用
variableMultisampleRate可变 MSAA每个子通道可以有不同的采样率⚠️ 特定场景
inheritedQueries继承查询支持Secondary Command Buffer 继承 query✅ 渲染统计需求

📚 示例:开启特性

//打印支持的特性
VkPhysicalDeviceFeatures features;
vkGetPhysicalDeviceFeatures(physicalDevice, &features);

if (features.samplerAnisotropy)
std::cout << "支持各向异性过滤!" << std::endl;

if (features.geometryShader)
std::cout << "支持 Geometry Shader!" << std::endl;


//开启特性
VkPhysicalDeviceFeatures enabled{};
enabled.samplerAnisotropy = VK_TRUE;
enabled.multiDrawIndirect = VK_TRUE;

VkDeviceCreateInfo createInfo{};
createInfo.pEnabledFeatures = &enabled;

vkCreateDevice(physicalDevice, &createInfo, nullptr, &device);